Lautapelioppaaseen toivottiin artikkeleihin arviota lukuajasta. En pidä itse tätä erityisen tarpeellisena ominaisuutena, mutta jos joku kerran kokee, niin voihan sellaista kokeilla, tuumin. Tehtävään on olemassa plugineita (esimerkiksi Reading Time for WordPress), mutta koska asia on helppo tehdä itsekin, tein sen.
Aluksi täytyy tietysti olla joku käsitys siitä, mikä on tavallinen lukunopeus. Googlailemalla löysin arvioita, joiden mukaan suomalaisten keskimääräinen lukunopeus on 150–200 sanaa minuutissa. Suomeksihan lukeminen on vähän hitaampaa kuin vaikkapa englanniksi, jossa sanat ovat lyhyempiä (ilmeisesti englanniksi aikuisten keskinopeus on luokkaa 275 sanaa minuutissa). Otetaan siis tuosta puolivälistä nopeudeksi 175 sanaa minuutissa.
Mediumin jutussa lukuaika-arvioista esitellään menetelmä, jossa kuvat lisäävät lukuaikaa. Ensimmäinen kuva lisää aikaa 12 sekunnilla, seuraava 11 sekunnilla ja niin edelleen, kunnes kymmenennestä kuvasta eteenpäin aikaa lisätään 3 sekuntia kuvaa kohden. Koska Lautapelioppaassa kuvat on pääasiassa merkityksellisiä ja niitä todennäköisesti pysähdytään katselemaan, tämä on mielestäni ihan hyvä. Jos jutuissa välitetään tietoa enemmän kuvilla, arvio lienee alakanttiin ja jos jutuissa on paljon merkityksettömiä kuvituskuvia, tämä lisännee liikaa aikaa, eli kannattaa säätää tarpeen mukaan.
WordPressissä on helppo laskea artikkelin sanamäärä, olettaen että artikkelin sisältö on itse artikkelissa. Jos teksti haalitaan kasaan paljolti esimerkiksi Advanced Custom Fieldsin metakentistä, nekin pitää huomioida sanamäärää laskettaessa. Sanamäärän ja aika-arvion voisi laskea artikkelia tallennettaessa ja tallentaa sen tietokantaan talteen, mutta tein tämän nyt niin, että lukema lasketaan jokaisella sivunlatauksella, koska siihen ratkaisuun sisältyy vähemmän ylimääräistä kalustelua. Laskelma on nopea ja Lautapelioppaassa ja täällä on sen verran hyvät välimuistiratkaisut, että suurin osa kävijöistä näkee joka tapauksessa välimuistista tulevan sivun. Pidemmän päälle fiksumpaa olisi toki hoitaa laskenta vain artikkelia tallennettaessa.
Sitten koodia:
function lukuaika() { global $post; $teksti = strip_tags( $post->post_content ); $teksti = preg_replace( '/\s+/', ' ', $teksti ); $sanoja = count( explode( ' ', $teksti ) ); $kuvia = substr_count( $post->post_content, '<img' ); $kuvien_sekunnit = 0; for ( $i = 0; $i < $kuvia; $i++ ) { if ( $i < 10 ) { $kuvien_sekunnit += 12 - $i; } else { $kuvien_sekunnit += 3; } } $kuvien_minuutit = $kuvien_sekunnit / 60; $sanaa_minuutissa = 175; $minuutit = round( $sanoja / $sanaa_minuutissa + $kuvien_minuutit ); if ( $minuutit < 1 ) { $minuutit = '<1'; } return $minuutit; }
Tämä funktio laskee nykyisen artikkelin sanamäärän ja kuvien määrän ja niiden perusteella esittää lukuaika-arvion tasaminuutteihin pyöristettynä. Lopuksi funktio palauttaa minuuttimäärän (tai ”<1”, jos tulos pyöristyy nollaksi).
Lisäsin täällä lukuajan artikkelin otsikkotietoihin näin:
<?php if ( 'post' === get_post_type() ) : ?> <div class="entry-meta"> <?php slightly_posted_on(); ?> | <span class="lukuaika">Lukuaika <?php echo lukuaika(); ?> min</span> </div> <?php